package com.cmcc.sdtp.client;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.cmcc.sdtp.sdtp.util.AuthUtil;
import com.cmcc.sdtp.sdtp.util.MessageUtil;
import com.cmcc.sdtp.util.SdtpPropertiesUtil;

/**
 * @className：鉴权
 * @author B
 * @date:
 * @version : 1.0
 */
public class LinkAuth {
	
	private static Logger logger = LogManager.getLogger(LinkAuth.class);
			
	public static final int linkAuth_Req = 0x0002; // 鉴权请求
	public static final int linkAuth_Resp = 0x8002;// 鉴权响应
	public static final int[] linkAuth = { 4, 2 };

	/**
	 * @comment 链路鉴权请求
	 * @return
	 * @version: 1.0
	 * @return
	 */
	public static byte[] linkAuth_Req() {
		List<byte[]> list = new ArrayList<byte[]>();
		// 获取信息头
		list.add(Messagedispose.createMessageHeader(linkAuth_Req));
		// 账户ID 12 由连接的服务端给连接的客户端分配的连接帐号
		String LoginID = (SdtpPropertiesUtil.getProperty("LoginIDClient") + "            ").substring(0, 12);
		String Sharedsecret = SdtpPropertiesUtil.getProperty("SharedsecretClient");// 64
		// 时间戳的明文。由客户端产生,单位为秒（1970年1月1日0时0分0秒起至当前的偏移总秒数）
		int Timestamp = (int) ((new Date()).getTime() / 1000);
		int rand = Math.abs((new Random()).nextInt(Short.MAX_VALUE));
		
		String Digest = AuthUtil.SHA256(LoginID  + AuthUtil.SHA256(Sharedsecret) + Timestamp + "rand=" + rand);
		String temp[] = { Timestamp + "", rand + "" };
		logger.info("Digest:" + Digest + ";LoginID:" + LoginID + ";Sharedsecret:" + Sharedsecret + ";Timestamp:" + Timestamp + ";rand:" + rand);
		list.add(Util.encodeToSendbytes(new String[] { LoginID }, new int[] { 12 }));
		list.add(MessageUtil.toByteArrayFromHex(Digest + "0000000000000000000000000000000000000000000000000000000000000000", 64));
		list.add(Util.encodeToSendbytes(temp, linkAuth));

		return Util.bulidByteArr(list);
	}

	/**
	 * @comment 鉴权响应解析
	 * @return
	 * @version: 1.0
	 * @param buffer
	 * @return
	 */
	public static boolean linkAuth_Resp(ByteBuffer buffer) {
		logger.debug("鉴权响应解析");
		// int result = 0;字节数1 返回原因值。
		// 鉴权的返回结果。各个值的含义如下定义：
		// 1 代表鉴权通过。
		// 2 代表LoginID不存在。
		// 3 代表SHA256加密结果出错。
		byte[] result = new byte[1];
		byte[] Digest = new byte[64];
		logger.debug("Digest：" + Digest);
		buffer.get(result);
		switch (Util.unbuildNumericWithSpace(result, 1)) {
		case 1:
			logger.debug("鉴权通过");
			return true;
		case 2:
			logger.debug("鉴权未通过，LoginID不存在");
			return false;
		case 3:
			logger.debug("鉴权未通过，SHA256加密结果出错");
			return false;
		default:
			logger.debug("返回信息意义不明");
			return false;
		}
	}

}